package filter

import (
	"fmt"
	"github.com/beego/beego/v2/server/web/context"
	"kong-social-api/commons/base/controller"
	"kong-social-api/modules/login/model/dto"
	"kong-social-api/utils"
	"kong-social-api/utils/rdb"
)

// 登录过滤器拦截
func LoginFilter(ctx *context.Context) {
	// 获取登录的token
	token := ctx.Request.Header["Authorization"]
	// 判断token是否存在
	if len(token) == 0 {
		ctx.Output.JSON(controller.Response{Code: 60001, Message: "请携带token进行访问！"}, true, true)
		return
	}

	// 获取头部用户的
	userLoginUuid := token[0]
	if len(userLoginUuid) == 0 {
		ctx.Output.JSON(controller.Response{Code: 60001, Message: "请携带token进行访问！"}, true, true)
		return
	}

	// 判断当前token是否在黑名单中，如果在黑名单中就直接退出
	cacheKey := fmt.Sprintf("USER:BLACKlIST:%s", userLoginUuid)
	cacheUuid, _ := rdb.RdbGet(cacheKey)
	if len(cacheUuid) > 0 && cacheUuid == userLoginUuid {
		// 如果过期了就直接返回，token失效
		ctx.Output.JSON(controller.Response{Code: 60001, Message: "请重新登录！"}, true, true)
		return
	}

	// 如果用户还在登录中，就使用UUID到缓存中获取用户信息
	cacheLoginKey := fmt.Sprintf("LOGIN:USER:%s", userLoginUuid)
	cacheUser, err := rdb.RdbHGet(cacheLoginKey, "user")
	if err == nil {
		userDto := dto.UserDto{}
		utils.JsonToStruct(cacheUser.(string), &userDto)
		// 如果没有。就获取用户信息，下放到路由处理方法中，这样给后续需要用户信息的地方可以直接获取
		ctx.Input.SetData("uuid", userLoginUuid)
		ctx.Input.SetData("userId", userDto.ID)
		ctx.Input.SetData("userName", userDto.UserName)
		ctx.Input.SetData("avatar", userDto.Avatar)
	}
}
